package com.atguigu.userprofile.ml.train

import com.atguigu.userprofile.ml.pipeline.MyPipeline
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object StudentGenderTrainApp {

  def main(args: Array[String]): Unit = {
     //  1  环境
     println("环境。。")
         val sparkConf: SparkConf = new SparkConf()
           .setAppName("student_gender_train").setMaster("local[*]")
         val sparkSession: SparkSession = SparkSession.builder()
           .config(sparkConf).enableHiveSupport().getOrCreate()

    //   2  准备要进行的数据
    //     标签列保持不动
    //     特征列的分类特征 转成数字
    println("查询数据。。")
    val originDataFrame: DataFrame = sparkSession.sql(
      """
select uid ,  case hair when '长发' then 11
                        when '短发' then 12
                        when '板寸' then 13 end  as hair,
                   height ,
               case skirt when '是' then 21
                        when '否' then 22  end  as skirt,
               case age when '00后' then 100
                        when '90后' then 90
                        when '80后' then 80 end  as age,
                       gender
             from user_profile1214.student
         """.stripMargin)

    //   3  把数据拆分 拆分成一份 训练集 一份 测试集    一般 8:2 或 7:3
    println("拆分数据。。")
        val   Array(trainDF,testDF) = originDataFrame.randomSplit(Array(0.8,0.2))
    trainDF.show(100,false)


    //   4  把训练集送入pipeline 进行训练
    println("训练模型。。")
    val pipeline = new MyPipeline().setLabelColumnName("gender")
                           .setFeatureColumnNames(Array("hair","height","skirt","age"))
        .setMaxDepth(2)
    pipeline.init()

    pipeline.train(trainDF)
    // 查看 决策树   和  特征权重
    println(pipeline.getDecisionTreeString())
    println(pipeline.getFeatureImportances())

    //   5  得到训练模型 ，再把测试集交个训练模型 进行预测
    println("模型预测。。")
    val predictedDataFrame: DataFrame = pipeline.predict(testDF)
    println("评估报告。。")
    pipeline.evaluate(predictedDataFrame);
    // 6 把预测的结果 中 预测矢量列 转为 原值
    println("预测结果转换。。")
    val convertedDataframe: DataFrame =
      pipeline.convertOriginLabel(predictedDataFrame)

    convertedDataframe.show(100,false)

  }

}
